package com.ck.dao;

import java.util.List;

import com.ck.model.company.vo.CpAllDeviceVO;
import com.ck.model.company.vo.CpSingleDeviceVO;
import org.apache.ibatis.annotations.Param;

import com.ck.model.chuangke.dto.CkDeviceDetailDTO;
import com.ck.model.chuangke.vo.CkDeviceInfoListExportVO;
import com.ck.model.chuangke.vo.CkDeviceInfoListVO;
import com.ck.model.chuangke.vo.CkDeviceLogListVO;
import com.ck.model.chuangke.vo.CkUpgradeDeviceListVO;
import com.ck.model.company.dto.CpDeviceDetailDTO;
import com.ck.model.company.vo.CpDeviceInfoListVO;
import com.ck.model.company.vo.CpProgramPutinDeviceListVO;
import com.github.pagehelper.Page;

public interface DeviceMapper {

    /**
      * 商家查询终端信息列表
     * @param companyCode
     * @param groupId
     * @param deviceNum
     * @param deviceIp
     * @param deviceMac
     * @param deviceName
     * @param deviceStatus
     * @return
     */
	Page<CpDeviceInfoListVO> listByPageForCp(@Param("companyCode") String companyCode,@Param("groupId") Long groupId, @Param("deviceNum") String deviceNum,
			@Param("deviceIp")String deviceIp, @Param("deviceMac") String deviceMac,@Param("deviceName") String deviceName,@Param("deviceStatus") Integer deviceStatus);

    /**
     * 获取终端总数
     * @return
     */
	Long getDeviceCount();

    /**
     * 根据大区查询终端总数
     * @param region 大区：东北NE，华北NC，华中CC，华东EC，华南SC，西北WN，西南WS
     * @return
     */
	Long getDeviceCountByRegion(@Param("region") String region);

    /**
     * 根据大区和状态查询终端总数
     * @param region 大区：东北NE，华北NC，华中CC，华东EC，华南SC，西北WN，西南WS
     * @param status 状态：0.在线; 1.离线
     * @return
     */
	Long getDeviceCountByRegionAndStatus(@Param("region") String region, @Param("status") Integer status);
	/**
	 * 商家条件查询终端设备数量
	 * @param companyCode
	 * @param status
	 * @param deviceNum
	 * @param deviceIp
	 * @param deviceMac
	 * @param groupId
	 * @return
	 */
	Long getCpDeviceCountByConditions(@Param("companyCode")String companyCode, @Param("deviceStatus")Integer status, @Param("deviceNum")String deviceNum,
			@Param("deviceIp") String deviceIp,@Param("deviceMac")String deviceMac, @Param("groupId") Long groupId);

	/**
	 * 某个商家将分组ID置为空
	 * @param companyCode
	 * @param groupId
	 */
	int updateDeviceGroupNull(@Param("companyCode")String companyCode, @Param("groupId")Long groupId);


    /**
     * 根据终端分组查询终端机器码
     *
     * @param groupCodeArr 终端分组码（数组）
     * @return List
     */
    List<String> selectDeviceCodeListByDeviceGroups(@Param("groupCodeArr") String[] groupCodeArr);

    /**
     * 条件查询某个商家下所有deviceCode
     * @param companyCode
     * @return
     */
	List<String> listAllDeviceCode(@Param("companyCode")String companyCode,@Param("groupIds")List<String> groupIds);

	/**
	 * 根据终端mac或者机器码查询终端详情
	 * @param companyCode 商家code
	 * @param deviceMac 终端mac
	 * @param deviceCode 终端机器码
	 * @return
	 */
	List<CpDeviceDetailDTO> getDeviceDetailByDeviceMacOrDeviceCode(@Param("companyCode") String companyCode, @Param("deviceMac")String deviceMac,
			@Param("deviceCode") String deviceCode);

	/**
	 * 终端升级固件或软件
	 * @param deviceMac
	 * @param companyCode
	 * @param softwareUpgradeId 软件Id
	 * @param firmwareUpgradeId 固件Id
	 */
	Integer deviceUpgrade(@Param("deviceMac")String deviceMac,@Param("companyCode")String companyCode,
			@Param("softwareUpgradeId")Long softwareUpgradeId, @Param("firmwareUpgradeId")Long firmwareUpgradeId);

    /**
     * 节目投放选择终端列表分页
     *
     * @param companyCode      商家编号
     * @param deviceCode       终端机器码
     * @param deviceGroupIdArr 分组ID
     * @param province         省
     * @param city             市
     * @param area             区
     * @param startTimeL       投放开始时间
	 * @param endTimeL         投放结束时间
	 * @param putinLevel       投放级别（1普通，2插播）
     * @return Page<CpProgramPutinDeviceListVO>
     */
	Page<CpProgramPutinDeviceListVO> listProgramPutinDeviceByPage(@Param("companyCode") String companyCode,
                                                                  @Param("deviceCode") String deviceCode,
                                                                  @Param("deviceGroupIdArr") String[] deviceGroupIdArr,
                                                                  @Param("province") String province,
                                                                  @Param("city") String city,
                                                                  @Param("area") String area,
                                                                  @Param("startTime") Long startTimeL,
                                                                  @Param("endTime") Long endTimeL,
																  @Param("putinLevel") Integer putinLevel);

    /**
     * 节目投放选择终端列表分页
     *
     * @param companyCode      商家编号
     * @param deviceCode       终端机器码
     * @param deviceGroupId 分组ID
     * @param province         省
     * @param city             市
     * @param area             区
     * @param startTimeL       投放开始时间
	 * @param endTimeL         投放结束时间
	 * @param putinLevel       投放级别（1普通，2插播）
     * @return Page<CpProgramPutinDeviceListVO>
     */
	Page<CpProgramPutinDeviceListVO> listProgramPutinDeviceBySingleGroupByPage(@Param("companyCode") String companyCode,
                                                                  @Param("deviceCode") String deviceCode,
                                                                  @Param("deviceGroupId") Long deviceGroupId,
                                                                  @Param("province") String province,
                                                                  @Param("city") String city,
                                                                  @Param("area") String area,
                                                                  @Param("startTime") Long startTimeL,
                                                                  @Param("endTime") Long endTimeL,
																  @Param("putinLevel") Integer putinLevel);
	/**
     * 创客后台查看终端信息列表
     * @param startTime  终端创建时间-开始
     * @param endTime    终端创建时间-结束
     * @param deviceCode  终端唯一编码
     * @param deviceMac   终端mac地址
     * @param companyName 商家名称
     * @param deviceName 终端名（备注）
     * @param province 省
     * @param city 市
     * @param area 地区
     * @return
     */
	Page<CkDeviceInfoListVO> listByPageForCk(@Param("startTime")Long startTime, @Param("endTime")Long endTime,
			@Param("deviceCode")String deviceCode,@Param("deviceMac")String deviceMac, @Param("companyName")String companyName,
			@Param("deviceName")String deviceName,@Param("province")String province, @Param("city")String city, @Param("area")String area);

	 /**
     * 创客后台条件导出终端信息列表
     * @param startTime  终端创建时间-开始
     * @param endTime    终端创建时间-结束
     * @param deviceCode  终端机器码
     * @param deviceMac   终端mac地址
     * @param companyName 商家名称
     * @param deviceName 终端名称（备注）
     * @param province 省
     * @param city 市
     * @param area 地区
     * @return
     */
	List<CkDeviceInfoListExportVO> listByExportForCk(@Param("startTime")Long startTime, @Param("endTime")Long endTime,
			@Param("deviceCode")String deviceCode,@Param("deviceMac")String deviceMac, @Param("companyName")String companyName,
			@Param("deviceName")String deviceName, @Param("province")String province, @Param("city")String city, @Param("area")String area);

	/**
	 * 创客后台查询终端日志列表
	 * @param start  日志上传时间-开始
	 * @param end 日志上传时间-结束
	 * @param deviceCode  终端唯一编码
	 * @param logType 日志类型 @see LogType
	 * @param pageNum
	 * @param pageSize
	 * @return
	 */
	Page<CkDeviceLogListVO> listDeviceLogs(@Param("startTime") Long startTime, @Param("endTime") Long endTime,
			@Param("deviceCode") String deviceCode, @Param("logType")String logType);

	/**
	 * 创客终端查询终端详情
	 * @param deviceCode
	 * @return
	 */
	List<CkDeviceDetailDTO> getDeviceDetailForCk(@Param("deviceCode") String deviceCode);

	/**
	 *  查询终端mac地址和商家是否 匹配，如果匹配返回终端mac，防止越权访问
	 * @param deviceCode
	 * @return
	 */
	String deviceBelongToCp(@Param("deviceCode") String deviceCode,@Param("companyCode") String companyCode);

	/**
	 * 查询一组终端mac地址和商家是否 匹配，如果匹配返回终端mac数组，防止越权访问
	 * @param deviceMacs
	 * @return
	 */
	List<String> macsBelongToCp(@Param("deviceMacs") List<String> deviceMacs,@Param("companyCode") String companyCode);

	/**
	 * 更新终端基础信息
	 * @param deviceCode  code
	 * @param deviceName  终端名（备注）
	 * @param companyCode  商家编码
	 * @param region  大区（如：华东）
	 * @param province 省
	 * @param city  市
	 * @param area 地区
	 * @param detailAddr 详细地址
	 */
	int updateDeviceBasicInfo(@Param("deviceCode")String deviceCode, @Param("deviceName")String deviceName,@Param("companyCode")String companyCode,
			@Param("region")String region,@Param("province")String province, @Param("city")String city, @Param("area")String area,
			@Param("detailAddr")String detailAddr);

	/**
	 * 查询所有终端中所有的mips版本号
	 * @return List<String>
	 */
	List<String> listAllSoftwareVersion();

	/**
	 * 查询所有终端中所有的固件版本号
	 * @return List<String>
	 */
	List<String> listAllFirmwareVersion();

	/**
	 * 根据终端分组查询终端mac
	 *
	 * @param groupIdArr 	终端分组ID（数组）
	 * @param companyCode  商家编号
     * @return List<String>
	 */
	List<String> selectDeviceMacListByDeviceGroups(@Param("groupIdArr") String[] groupIdArr,
												   @Param("companyCode") String companyCode);

	/**
	 * 根据终端分组查询终端code
	 *
	 * @param groupIdList 	终端分组ID
	 * @param companyCode  商家编号
     * @return List<String>
	 */
	List<String> selectDeviceCodesByDeviceGroupsWithGroup(@Param("groupIdList") List<String> groupIdList,
												   @Param("companyCode") String companyCode);

	/**
	 * 查询所有无分组的终端code
	 *
	 * @param companyCode  商家编号
     * @return List<String>
	 */
	List<String> selectDeviceCodesNoGroup(@Param("companyCode") String companyCode);

	/**
     * 终端升级分页筛选查询终端
     * @param softVer  软件版本
     * @param firmVer  固件版本
     * @param deviceStatus  终端状态（在线OR离线）
     * @param modelName 终端型号
     * @param province 省
     * @param city 市
     * @param area 区
     * @param companyName 商家名称
     * @return
     */
	Page<CkUpgradeDeviceListVO> listUpgradeDeviceByPage(@Param("softVer")String softVer, @Param("firmVer")String firmVer,
			@Param("deviceStatus")Integer deviceStatus,@Param("modelName")String modelName,
			@Param("province")String province, @Param("city")String city, @Param("area")String area,
			@Param("companyName") String companyName);

	/**
	 * 条件查询终端统计符合条件的终端数量
     * @param softVer  软件版本
     * @param firmVer  固件版本
     * @param deviceStatus  终端状态（在线OR离线）
     * @param modelName 终端型号
     * @param province 省
     * @param city 市
     * @param area 区
     * @param companyName 商家名称
	 * @return
	 */
	Long getDeviceCountByCondition(@Param("softVer")String softVer, @Param("firmVer")String firmVer, @Param("deviceStatus")Integer deviceStatus,
			@Param("modelName")String modelName,@Param("province")String province,@Param("city") String city,
			@Param("area")String area, @Param("companyName")String companyName);

	/**
	 * 商家-全部终端列表
	 * @param startTime 开始时间
	 * @param endTime 结束时间
	 * @param province 省份
	 * @param city 城市
	 * @param area 区/县
	 * @param deviceCode 机器码
	 * @param deviceMac 终端MAC
	 * @param deviceGroup 所属分组
	 * @param companyCode 商家代码
	 * @return
	 */
	Page<CpAllDeviceVO> allDevicePageCp(@Param("startTime") Long startTime,
										@Param("endTime") Long endTime,
										@Param("province") String province,
										@Param("city") String city,
										@Param("area") String area,
										@Param("deviceCode") String deviceCode,
										@Param("deviceMac") String deviceMac,
										@Param("deviceGroup") String deviceGroup,
										@Param("companyCode") String companyCode);

	/**
	 * 根据商家编码和节目版本号查询终端code集合
	 *
	 * @param companyCode 商家编码
	 * @param versionList 版本号集合
	 * @return 终端code集合
	 */
    List<String> listDeviceCodeByCompanyCodeAndProgramVersion(@Param("companyCode") String companyCode,
															 @Param("versionList") List<String> versionList);

    /**
     * 商家-单个终端列表
     * @param startTimeL 开始时间
     * @param endTimeL 结束时间
     * @param deviceCode 机器码
     * @param deviceMac 终端MAC
     * @param companyCode 商家代码
     * @return
     */
    Page<CpSingleDeviceVO> singleDevicePageCp(@Param("startTime") Long startTimeL,
                                              @Param("endTime") Long endTimeL,
                                              @Param("deviceCode") String deviceCode,
                                              @Param("deviceMac") String deviceMac,
                                              @Param("companyCode") String companyCode);
    /**
     * 如果设备长时间不在线，更新终端为离线状态，返回更新条数
     * @param timeDiff
     * @return
     */
	int setDeviceOffLine(Long timeDiff);

	/**
	 * 解绑终端
	 * @param deviceCodeList 终端code集合
	 */
    void untie(@Param("deviceCodeList") List<String> deviceCodeList);
}